/**
 * Copyright (c), 上海沃恩信息科技有限公司.
 * All rights reserved.
 * Licensed under BSD (https://www.pittypat.work/bsd.html).
 */

package pittypat.web;

import java.io.File;
import java.net.URI;

/**
 * 提供对文件路径的处理。
 */
final class Path {
	private Path() {
	}

	/**
	 * 获取指定文件名称的扩展名称，包含句点。
	 * 
	 * @param name
	 *            原始文件名称。
	 * @return 文件的扩展名称，如果没有扩展名称，返回空字符串。
	 */
	public static String getExtension(String name) {
		if (name == null || name.length() == 0) {
			return "";
		}

		int index = name.lastIndexOf('.');
		if (index >= 0) {
			return name.substring(index);
		}

		return "";
	}

	/**
	 * 获取指定路径中文件名称，包含扩展名称。
	 * 
	 * @param path
	 *            文件的完整路径。
	 * @return 文件名称。
	 */
	public static String getFileName(String path) {
		if (path == null || path.length() == 0) {
			return "";
		}

		int index = path.lastIndexOf(File.pathSeparatorChar);
		if (index >= 0) {
			return path.substring(index + 1);
		}

		return path;
	}

	/**
	 * 获取指定请求的完整路径以及各个组成部分（小写形式）。
	 * 
	 * @param uri
	 *            请求路径。
	 * 
	 * @return 一个字符串数组。第一个元素为去除了 appPath 的完整路径，后续依次为：开发者代码、App标识符、模块标识符、功能标识符。如果
	 *         URI 语法错误，则返回 null。对于 /user/ 和 /notification/ 两个特殊的路径，则格式为 /user/*
	 *         或 /notification/*。
	 */
	public static String[] getFuncPaths(URI uri) {
		// 配置文件中定义的当前应用根路径，根路径 以 '/' 开始，以 '/' 结束
		String appPath = ApiContextListener.getAppPath();

		// 所获得的 path 使用 '/' 为前缀
		String path = uri.getPath().toLowerCase().replace('\\', '/');

		// 去除根路径，去除根路径部分后，path 第一个字符不再是 '/'
		if (path.startsWith(appPath)) {
			path = path.substring(appPath.length());
		} else {
			// 请求路径不是以 appPath 开头的，这是一个无效的路径
			return null;
		}

		// 分割为各个部分
		String[] names = path.split("/");

		// 此处不能认为分割后 names 数组的长度应该为 4，因为对于 "/user/" 和 "/notification/"
		// 两种请求，它们路径格式不是 "/开发者代码/App标识符/模块标识符/功能标识符"。
		if (names.length < 1) {
			return null;
		}

		// 复制到 parts 数组中，并将 parts 第一个元素设置为完整的路径。
		String[] parts = new String[names.length + 1];
		// 确保完整路径第一个字符为 '/'
		parts[0] = "/" + path;

		for (int i = 0; i < names.length; ++i) {
			parts[i + 1] = names[i];
		}

		return parts;
	}
}
